#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>

#define PATHNAME "/home/tcq/linux-training-code/lesson21/shm/demo.cc" // 路径名

#define PROJ_ID 0x6666 // 整数标识符
#define SIZE 4096      // 共享内存的大小

int main()
{
    key_t key = ftok(PATHNAME, PROJ_ID); // 获取key值
    if (key < 0)
    {
        perror("ftok");
        return 1;
    }

    int shm = shmget(key, SIZE, IPC_CREAT | IPC_EXCL | 0666); // 创建新的共享内存
    if (shm < 0)
    {
        perror("shmget");
        return 2;
    }

    printf("key: %x\n", key); // 打印key值
    printf("shm: %d\n", shm); // 打印句柄

    printf("attach begin!\n");
    sleep(1);
    void *mem = shmat(shm, NULL, 0); // 挂接共享内存
    if (mem == (void *)-1)
    {
        perror("shmat");
        return 3;
    }
    printf("attach end!\n");

    printf("remove begin\n");
    sleep(1);
    if (shmdt(mem) == -1) // 去挂接共享内存
    {
        perror("shmdt");
        return 4;
    }
    printf("remove end\n");

    sleep(1);
    shmctl(shm, IPC_RMID, NULL); // 释放共享内存
    sleep(1);
    return 0;
}